/***
 * @Author: LVGRAPE
 * @Date: 2023-09-20 18:42:54
 * @LastEditTime: 2023-09-20 18:47:32
 * @LastEditors: LVGRAPE
 * @Description:
 * @FilePath: \ZINO_FC_V4\ZINO\inc\rc.h
 * @要啥没啥，爱咋咋的
 */

#ifndef __RC_H_
#define __RC_H_
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

#include "si24r1.h"
#include <stdbool.h>
#include "zino_config.h"
#include <rtdef.h>
#define RTX_BUFFER_SIZE 20
#define RC_HOPPING_SET_NONE 0XFF
    enum rc_mode {
        RC_MODE_NULL = 0,
        RC_MODE_PAIRING,
        RC_MODE_NORMAL,
    };
    typedef enum ZINO_COMMON_RC_CHANNEL_index
    {
        ZINO_COMMON_RC_S_RLR = 0, // 右边摇杆的左右
        ZINO_COMMON_RC_S_RUD,     // 右边摇杆的上下
        ZINO_COMMON_RC_S_LUD,     // 左边摇杆的上下
        ZINO_COMMON_RC_S_LLR,     // 左边摇杆的左右
        ZINO_COMMON_RC_B_RL,      // 右边按键的左
        ZINO_COMMON_RC_B_RR,      // 右边按键的右
        ZINO_COMMON_RC_B_RD,      // 右边按键的下
        ZINO_COMMON_RC_B_RU,      // 右边按键的上
        ZINO_COMMON_RC_B_LD,      // 左边按键的下
        ZINO_COMMON_RC_B_LU,      // 左边按键的上
        ZINO_COMMON_RC_B_LL,      // 左边按键的左
        ZINO_COMMON_RC_B_LR,      // 左边按键的右
        ZINO_COMMON_RC_B_S12,     // 按键S12
        ZINO_COMMON_RC_B_S13,     //
        ZINO_COMMON_RC_B_S14,     //
        ZINO_COMMON_RC_B_S15,     //
        ZINO_COMMON_RC_B_S16,     //
        ZINO_COMMON_RC_B_S17,     //
    } ZINO_COMMON_RC_CHANNEL_Index_e;
    typedef struct zino_common_rc_button
    {
        bool RL : 1;  // 右边按键的左
        bool RR : 1;  // 右边按键的右
        bool RD : 1;  // 右边按键的下
        bool RU : 1;  // 右边按键的上
        bool LD : 1;  // 左边按键的下
        bool LU : 1;  // 左边按键的上
        bool LL : 1;  // 左边按键的左
        bool LR : 1;  // 左边按键的右
        bool q : 1;   // 按键S12
        bool d : 1;   // 按键S13
        bool b : 1;   // 按键S14
        bool p : 1;   // 按键S15
        bool LT : 1;  // 按键S16
        bool RT : 1;  // 按键S17
        bool S18 : 1; // 按键S18
        bool S19 : 1; // 按键S19
    } ZINO_COMMON_RC_BUTTON_S;
    typedef struct zino_common_rc_sticks
    {
        uint16_t RLR; // 右边摇杆的左右0~2000
        uint16_t RUD; // 右边摇杆的上下0~2000
        uint16_t LUD; // 左边摇杆的上下0~2000
        uint16_t LLR; // 左边摇杆的左右0~2000
    } ZINO_COMMON_RC_STICK_S;
    typedef union ZINO_COMMON_RC_CHANNEL
    {
        struct channel
        {
            uint8_t head;
            uint8_t index;
            ZINO_COMMON_RC_STICK_S stick;
            ZINO_COMMON_RC_BUTTON_S button;
            uint32_t timestamp;
            uint8_t mode;
            uint8_t crc;
        } __attribute__((packed)) values;
        uint8_t raw[18];
    } ZINO_COMMON_RC_CHANNEL_s;

    extern ZINO_COMMON_RC_CHANNEL_s zinoCommonRcData;
    extern ZINO_COMMON_RC_CHANNEL_s zinoCommonCmData;
    typedef union wl_msg
    {
        struct
        {
            uint8_t head;
            uint8_t index;
            uint16_t channel[8];
            uint8_t tail;
            uint8_t crc;
        } v;
        uint8_t raw[RTX_BUFFER_SIZE];
    } wl_msg_t;
    typedef enum RC_ALL_STATUS
    {
        /*发送中*/
        RC_TRANSMITTING = 0,
        // 发送完
        RC_TRANSMITTED,
        // 接收中
        RC_RECEIVING,
        // 接收完
        RC_RECEIVED,
        /*对频中*/
        RC_PAIRING,
        //对频完
        RC_PAIR_SUCCESS,
        //对频失败
        RC_PAIR_FAIL,
        //超时
        RC_TIMEOUT,
        RC_RX_TIMEOUT,

    } RC_STATUS_E;
    enum rc_event
    {
        RC_EVENT_LOST = 0X01,
        RC_EVENT_GET_MSG = 0X02,
        RC_EVENT_PAIRING_SUCCESS = 0X04,
        RC_EVENT_PAIRING_FAIL = 0X08,
        RC_EVENT_PAIRING = 0X10,
        RC_EVENT_ALL = 0XFFFFFFFF,
    };
    struct rc_handle
    {
        struct si24r1 si24r1;
        enum rc_mode mode;
        enum rc_mode last_mode;
        RC_STATUS_E status;
        rt_uint8_t rf_channel;
        rt_uint8_t pair_channel;
        rt_uint8_t pair_handshake_byte;
        rt_uint8_t pair_handshake_byte_v1;
        rt_uint8_t pair_fc_handshake_byte;
        rt_uint8_t pair_rc_handshake_byte;
        rt_uint8_t pair_addr[5];
        rt_uint16_t pair_sync_time;
        rt_uint16_t pair_wait_time;
        rt_uint8_t hopping[5];
        rt_uint8_t address[5];
        rt_uint8_t hopping_cnt;
        rt_uint8_t max_channel;
        rt_uint8_t min_channel;
        rt_uint8_t newAddress[5];
        rt_uint8_t newRfChannel;
        uint16_t rx_lost;
        wl_msg_t rx_msg;
        wl_msg_t tx_msg;
        rt_uint8_t rx_len;
        rt_uint16_t rxCnt;
        rt_uint16_t rx_rssi;
        uint32_t pairConfirmTime;
        RC_STATUS_E state;
        rt_timer_t second_timer;
        rt_event_t event;
        rt_uint8_t hoppingSetting;
    };
    typedef struct rc_pair_data_s {
        rt_uint8_t flag;
        rt_uint8_t address[5];
        rt_uint8_t rf_channel;
        rt_uint8_t hoppingSetting;
    }rc_pair_data_t;
    extern struct rc_handle rchandle;
    uint16_t get_rc_fps();
    struct rc_handle *get_rc_channel_ram();
    uint16_t get_rc_channel(uint8_t rcchannel);
    void rc_into_pair_mode();
    void rc_into_normal_mode();
    void rc_keyActionHandle(uint8_t times);
    ZINO_CONFIG_DECLARE(rc_pair_data_t, pair_data);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif
